//Kerangka Program Utama
//File : main.cpp

#include "point/point/point.h"
#include "cell/cell/cell.h"
#include "latar/latar/latar.h"
#include "bidang/bidang/bidang.h"
#include "segitiga/segitiga/segitiga.h"
#include "polygon/polygon/polygon.h"
#include "segiempat/segiempat/segiempat.h"
#include "list/list/listD.h"

#include <cstdlib> // hanya untuk random char generator
#include <ctime> // hanya untuk random char generator
#include <iostream>
using namespace std;

char char_random(){
	static const char alpha[] = "0123456789QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm";
	srand(time(0));
	return (alpha[rand()%(sizeof(alpha)-1)]);
	}

int isSegiTiga(Point P1, Point P2, Point P3)
	/* Mengembalikan satu bila sebuah bidang adalah segitiga , dan nol bila bukan segitiga */
	{
		float area;
		area = ((P2.getX()-P1.getX())*(P3.getY()-P1.getY()) - ((P2.getY()-P1.getY())*(P3.getX()-P1.getX())))/2;
		if (area == 0) {
			return 0;
		}
		else {
			return 1;
		}
	}
	
	int isSegiEmpat(Point P1, Point P2, Point P3, Point P4)
	/* Mengembalikan satu bila sebuah bidang adalah persegi atau persegi panjang, dan nol bila bukan   */
	{
		if ((P1.IsDown(P2) ^ P1.IsDown(P3) ^ P1.IsDown(P4)) &&
			(P1.IsRight(P2) ^ P1.IsRight(P3) ^ P1.IsRight(P4))) {return 1;}
		else if ((P2.IsDown(P1) ^ P2.IsDown(P3) ^ P2.IsDown(P4)) &&
			(P2.IsRight(P1) ^ P2.IsRight(P3) ^ P2.IsRight(P4))) {return 2;}
		else if ((P3.IsDown(P2) ^ P3.IsDown(P1) ^ P3.IsDown(P4)) &&
			(P3.IsRight(P2) ^ P3.IsRight(P1) ^ P3.IsRight(P4))) {return 3;}
		else if ((P4.IsDown(P2) ^ P4.IsDown(P3) ^ P4.IsDown(P1)) &&
			(P4.IsRight(P2) ^ (P4.IsRight(P3) ^ P4.IsRight(P1)))) {return 4;}
		else {return 0;}
	}

int main () {
	int M,N,P;
	int x,y;
	int InvStat = 0;
	Cell *Ci;
	char menu;
	char CFill = char_random();
	cout << "Program bidang pada latar" << endl;
	cout << "Masukkan jumlah kolom pada latar: "; cin >> M;
	cout << "Masukkan jumlah baris pada latar: "; cin >> N;
	Latar La (M, N);
	La.DrawLatar();
	La.PrintLatar();
	cout << "Masukkan jumlah sisi bidang yang akan dibuat: "; cin >> P;
	Cell * arrC = new Cell [P];
	for (int i = 0; i<P; i++) {
		int x,y;
		cout << "Masukkan absis titik ke-" << i+1 << ": "; cin >> x;
		cout << "Masukkan ordinat titik ke-" << i+1 << ": "; cin >> y;
		Cell PT (x,y,'s');
		arrC[i] = PT;
	}
	switch (P) {
		case 3 : {
				if (isSegiTiga(arrC[0],arrC[1],arrC[2])) {
					La.setBidang(new Segitiga(arrC[0],arrC[1],arrC[2]));
				} 
				else {cout << "tidak dapat membentuk segitiga" << endl;};
				break;}
		case 4 : {
				if (isSegiEmpat(arrC[0],arrC[1],arrC[2],arrC[3]) == 1) 
				{
					La.setBidang(new SegiEmpat(arrC[0],arrC[1],arrC[2],arrC[3]));
				} 
				else if (isSegiEmpat(arrC[0],arrC[1],arrC[2],arrC[3]) == 2)
				{
					La.setBidang(new SegiEmpat(arrC[1],arrC[0],arrC[2],arrC[3]));
				} 
				else if (isSegiEmpat(arrC[0],arrC[1],arrC[2],arrC[3]) == 3)
				{
					La.setBidang(new SegiEmpat(arrC[2],arrC[1],arrC[0],arrC[3]));
				} 
				else if (isSegiEmpat(arrC[0],arrC[1],arrC[2],arrC[3]) == 4)
				{
					La.setBidang(new SegiEmpat(arrC[3],arrC[1],arrC[0],arrC[2]));
				}
				else {
					La.setBidang(new Polygon(P));
					for (int z=0; z<P; z++) {
						La.getBidang(0)->setCorner(z,arrC[z]);
					}
				}
				break;}
		default : {
				La.setBidang(new Polygon(P));
					for (int z=0; z<P; z++) {
						La.getBidang(0)->setCorner(z,arrC[z]);
					}
				}
	}
	cout << "cekpoin2-----------------------" << endl;
	La.drawAllBidang(CFill);
	cout << "cekpoin3-----------------------" << endl;
	La.PrintLatar();
	if (P == 4) {cout << "jenis segiempat: " << isSegiEmpat(arrC[0],arrC[1],arrC[2],arrC[3]) << endl;}
	
	 do {
		 cout << "Menu: " << endl;
		 cout << "Enter 'q' untuk quit " << endl;
		 cout << "Enter 'e' untuk menghapus bidang " << endl;
		 cout << "Enter 'f' untuk mengisi bidang dengan '*' " << endl;
		 cout << "Enter 'i' untuk menginvers isi bidang dengan latar " << endl;
		 cout << "Enter 'c' untuk menghitung kepadatan bidang" << endl;
		 cout << "Enter 's' untuk menghitung perbandingan karakter non blank dengan latar" << endl;
		 cout << "Pilihan Anda: "; cin >> menu;
		 switch (menu) {
			 case 'e' : {La.SweepLatar(); break;}
			 case 'f' : {La.drawAllBidang('*'); La.PrintLatar(); break;}
			 case 'i' : {if (InvStat == 0){
							La.DrawLatarInvers(CFill); La.drawAllBidangInvers() ; La.PrintLatar(); 
							InvStat++;
							break;}
						else {	
							La.DrawLatar(); La.drawAllBidang(CFill); La.PrintLatar();
							InvStat--;
							break;}
						}
			 case 'c' : {La.ComputeBN(); break;}
			 case 's' : {La.ComputeBL(); break;}
			 default : {cout << "Karakter yang Anda masukkan salah. Coba lagi." << endl; break;}
		 };
	 } while (menu != 'q');
	 delete [] arrC;
	 
	system("PAUSE");
	
	cout << "Bye..." << endl;
	
	//End of Program
	//Pembersihan memori dilakukan dengan memanggil semua destruktor objek
	//Memori yang dihapus:
	//Cell **aCell pada objek Latar
	//Cell *aCorner pada objek Bidang
	
	return 0;
}
